/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.log4j.lf5.viewer.categoryexplorer;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import java.util.Enumeration;

/**
 * CategoryNode
 * 
 * @author Michael J. Sikorsky
 * @author Robert Shaw
 */

// Contributed by ThoughtWorks Inc.
public class CategoryNode extends DefaultMutableTreeNode {
	private static final long serialVersionUID = 5958994817693177319L;
	//--------------------------------------------------------------------------
	// Constants:
	//--------------------------------------------------------------------------

	//--------------------------------------------------------------------------
	// Protected Variables:
	//--------------------------------------------------------------------------
	protected boolean _selected = true;
	protected int _numberOfContainedRecords = 0;
	protected int _numberOfRecordsFromChildren = 0;
	protected boolean _hasFatalChildren = false;
	protected boolean _hasFatalRecords = false;

	//--------------------------------------------------------------------------
	// Private Variables:
	//--------------------------------------------------------------------------

	//--------------------------------------------------------------------------
	// Constructors:
	//--------------------------------------------------------------------------

	/**
   *
   */
	public CategoryNode(String title) {
		setUserObject(title);
	}

	//--------------------------------------------------------------------------
	// Public Methods:
	//--------------------------------------------------------------------------
	public String getTitle() {
		return (String) getUserObject();
	}

	public void setSelected(boolean s) {
		if (s != _selected) {
			_selected = s;
		}
	}

	public boolean isSelected() {
		return _selected;
	}

	/**
	 * @deprecated
	 */
	public void setAllDescendantsSelected() {
		Enumeration children = children();
		while (children.hasMoreElements()) {
			CategoryNode node = (CategoryNode) children.nextElement();
			node.setSelected(true);
			node.setAllDescendantsSelected();
		}
	}

	/**
	 * @deprecated
	 */
	public void setAllDescendantsDeSelected() {
		Enumeration children = children();
		while (children.hasMoreElements()) {
			CategoryNode node = (CategoryNode) children.nextElement();
			node.setSelected(false);
			node.setAllDescendantsDeSelected();
		}
	}

	public String toString() {
		return (getTitle());
	}

	public boolean equals(Object obj) {
		if (obj instanceof CategoryNode) {
			CategoryNode node = (CategoryNode) obj;
			String tit1 = getTitle().toLowerCase();
			String tit2 = node.getTitle().toLowerCase();

			if (tit1.equals(tit2)) {
				return (true);
			}
		}
		return (false);
	}

	public int hashCode() {
		return (getTitle().hashCode());
	}

	public void addRecord() {
		_numberOfContainedRecords++;
		addRecordToParent();
	}

	public int getNumberOfContainedRecords() {
		return _numberOfContainedRecords;
	}

	public void resetNumberOfContainedRecords() {
		_numberOfContainedRecords = 0;
		_numberOfRecordsFromChildren = 0;
		_hasFatalRecords = false;
		_hasFatalChildren = false;
	}

	public boolean hasFatalRecords() {
		return _hasFatalRecords;
	}

	public boolean hasFatalChildren() {
		return _hasFatalChildren;
	}

	public void setHasFatalRecords(boolean flag) {
		_hasFatalRecords = flag;
	}

	public void setHasFatalChildren(boolean flag) {
		_hasFatalChildren = flag;
	}

	//--------------------------------------------------------------------------
	// Protected Methods:
	//--------------------------------------------------------------------------

	protected int getTotalNumberOfRecords() {
		return getNumberOfRecordsFromChildren() + getNumberOfContainedRecords();
	}

	/**
	 * Passes up the addition from child to parent
	 */
	protected void addRecordFromChild() {
		_numberOfRecordsFromChildren++;
		addRecordToParent();
	}

	protected int getNumberOfRecordsFromChildren() {
		return _numberOfRecordsFromChildren;
	}

	protected void addRecordToParent() {
		TreeNode parent = getParent();
		if (parent == null) {
			return;
		}
		((CategoryNode) parent).addRecordFromChild();
	}
	//--------------------------------------------------------------------------
	// Private Methods:
	//--------------------------------------------------------------------------

	//--------------------------------------------------------------------------
	// Nested Top-Level Classes or Interfaces:
	//--------------------------------------------------------------------------

}
